package com.atguigu.srb.common.exception;

import com.atguigu.srb.common.result.ResponseEnum;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 业务异常类
 * 继承自RuntimeException，用于封装业务逻辑中出现的异常
 * 包含错误码和错误消息两个核心属性
 * 提供多种构造函数以适应不同的异常场景
 */
@Data
@NoArgsConstructor
public class BusinessException extends RuntimeException {
    // 错误码
    private Integer code;
    // 错误消息
    private String message;

    /**
     * 只包含错误消息的构造函数
     *
     * @param message 错误消息
     */
    public BusinessException(String message) {
        this.message = message;
    }

    /**
     * 包含错误消息和错误码的构造函数
     *
     * @param message 错误消息
     * @param code    错误码
     */
    public BusinessException(String message, Integer code) {
        this.message = message;
        this.code = code;
    }

    /**
     * 包含错误消息、错误码和原始异常的构造函数
     * 用于包装其他异常，保留原始异常信息
     *
     * @param message 错误消息
     * @param code    错误码
     * @param cause   原始异常对象
     */
    public BusinessException(String message, Integer code, Throwable cause) {
        super(cause);
        this.message = message;
        this.code = code;
    }

    /**
     * 使用响应枚举创建异常的构造函数
     * 从枚举中获取错误码和错误消息
     *
     * @param resultCodeEnum 响应枚举类型
     */
    public BusinessException(ResponseEnum resultCodeEnum) {
        this.message = resultCodeEnum.getMessage();
        this.code = resultCodeEnum.getCode();
    }

    /**
     * 使用响应枚举和原始异常创建异常的构造函数
     * 从枚举中获取错误码和错误消息，并保留原始异常信息
     *
     * @param resultCodeEnum 响应枚举类型
     * @param cause          原始异常对象
     */
    public BusinessException(ResponseEnum resultCodeEnum, Throwable cause) {
        super(cause);
        this.message = resultCodeEnum.getMessage();
        this.code = resultCodeEnum.getCode();
    }

}